package com.itheima.reflect4;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class MyReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //利用反射获取成员方法

        //1.获取Class对象
        Class clazz = Class.forName("com.itheima.reflect4.Student");

        //2.获取所有public修饰的成员方法(可以获取到父类的方法）
       /* Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }*/

        //获取所有成员方法(可以获取到本类非public的方法，但不可以获取到父类的方法）
       /* Method[] declaredMethods = clazz.getDeclaredMethods();
        for (Method method : declaredMethods) {
            System.out.println(method);
        }*/

        //获取指定的成员方法
        Method eat = clazz.getDeclaredMethod("eat", String.class);
        System.out.println(eat);

        //通过获取到的成员方法去获取各种数据
        System.out.println(eat.getName());
        System.out.println(eat.getModifiers());
        Parameter[] parameters = eat.getParameters();
        for (int i = 0; i < parameters.length; i++) {
            System.out.println(parameters[i]);
        }
        Class<?>[] exceptionTypes = eat.getExceptionTypes();
        for (Class<?> exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }

        //创建对象调用该方法
        Student student = new Student("zhangsan", 18);

        Object result = eat.invoke(student, "apple");
        System.out.println(result);
    }
}
